package com.example.d2_bigdecimal;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 目标：掌握BigDecimal进行精确运算的方案
 */
public class Test2 {
    public static void main(String[] args) {
        double a = 0.1;
        double b = 0.2;
        double c = a + b;
        // 此时机会出现运算失真的问题,输出的结果并不是0.3
        System.out.println(c);
        System.out.println("----------------------------------------------");

        // 1.把浮点型数据封装成BigDecimal对象,再来参与运算
        // 原理是,把我传入的小数转成String,然后一位一位的去运算,这样可以避免结果失真的问题
        // a.public BigDecimal(double val) 得到的BigDecimal对象是无法精确计算浮点型数据的 注意：不推荐使用这个
        // b.public BigDecimal(String val)  得到的BigDecimal对象是可以精确计算浮点型数据的 可以使用
        // c.public static BigDecimal valueOf(double val): 通过这个静态方法得到的BigDecimal对象是可以精确运算的是最好的方案
        // 这种方式可以被调用valueOf代替,valueOf方法底层也是new BigDecimal(Double.toString(a)) 只是做了一层包装
        // BigDecimal bigDecimal = new BigDecimal(Double.toString(a)); 
        BigDecimal a1 = BigDecimal.valueOf(a);
        BigDecimal b1 = BigDecimal.valueOf(b);

        // 2.public BigDecimal add(BigDecimal augend): 加法
        BigDecimal c1 = a1.add(b1);
        System.out.println(c1);

        // 3.public BigDecimal subtract(BigDecimal augend): 减法
        BigDecimal c2 = a1.subtract(b1);
        System.out.println(c2);

        // 4.public BigDecimal multiply(BigDecimal augend): 乘法
        BigDecimal c3 = a1.multiply(b1);
        System.out.println(c3);

        // 5.public BigDecimal divide(BigDecimal b): 除法
        BigDecimal c4 = a1.divide(b1);
        System.out.println(c4);

        // 注意：0.1除0.3是除不尽的BigDecimal就会报错,解决方式,指定保留几位小数,否则BigDecimal不知道应该怎么处理
        // BigDecimal d1 = BigDecimal.valueOf(0.1);
        // BigDecimal d2 = BigDecimal.valueOf(0.3);
        // BigDecimal d3 = d1.divide(d2);
        // System.out.println(d3);

        // 6.public BigDecimal divide(另一个BigDecimal对象,精确几位,舍入模式) : 除法,可以设置精确几位
        BigDecimal d1 = BigDecimal.valueOf(0.1);
        BigDecimal d2 = BigDecimal.valueOf(0.3);
        // 表示把结果保留2位小数,并且四舍五入的规则
        BigDecimal d3 = d1.divide(d2, 2, RoundingMode.HALF_UP); // 0.33
        System.out.println(d3);

        // 7.public double doubleValue() : 把BigDecimal对象又转换成double类型的数据
        // print(d3);
        // print(c1);
        double db1 = d3.doubleValue();
        double db2 = c1.doubleValue();
        print(db1);
        print(db2);
    }

    public static void print(double a) {
        System.out.println(a);
    }
}
